package com.mastercard.assets.web.forms.process;

import com.mastercard.assets.MasterCardException;
import com.mastercard.assets.flows.FlowUtil;
import com.mastercard.assets.flows.process.FlowProcessContext;
import com.mastercard.assets.flows.process.FlowProcessInit;
import com.mastercard.assets.flows.process.FlowProcessPost;
import com.mastercard.assets.flows.process.FlowProcessPrevious;
import com.mastercard.assets.flows.process.FlowProcessResult;
import com.mastercard.assets.flows.to.FlowCampaignTO;
import com.mastercard.assets.jpa.TblAsset;
import com.mastercard.assets.jpa.TblCampania;
import com.mastercard.assets.jpa.TblCampaniaMes;
import com.mastercard.assets.jpa.TblCampaniaProductoAdq;
import com.mastercard.assets.jpa.TblCampaniaProductoUsuario;
import com.mastercard.assets.jpa.TblDomestic;
import com.mastercard.assets.jpa.TblFlujo;
import com.mastercard.assets.jpa.TblForma;
import com.mastercard.assets.jpa.TblPaquete;
import com.mastercard.assets.jpa.TblPreimplementacion;
import com.mastercard.assets.jpa.TblProducto;
import com.mastercard.assets.jpa.TblTarea;
import com.mastercard.assets.jpa.TblTareaPreimplementacion;
import com.mastercard.assets.util.MCUtil;
import com.mastercard.assets.util.dao.MasterCardDAO;
import com.mastercard.assets.web.struts.forms.FlowProcessForm;
import com.mastercard.assets.web.util.to.CampaniaProductoAdqWraper;
import com.mastercard.assets.web.util.to.TblAssetWraper;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;

public class PreimplementationCargaResultadosFormProcess
        implements
		FlowProcessInit , 
		FlowProcessPrevious , 
		FlowProcessPost
{
    
    public FlowProcessResult loadFormData( FlowProcessContext ctx )
		throws
			MasterCardException
	{		
		TblTareaPreimplementacion tblTareaPreimplementacion = ctx.getTblTareaPreimplementacion( ) ;//
		
		TblCampania campania = tblTareaPreimplementacion.getTblPreimplementacion( ).getTblCampania( ) ;
		
		TblPreimplementacion tblPreimplementacion = tblTareaPreimplementacion.getTblPreimplementacion( ) ;//
                
                TblAsset asseT= tblTareaPreimplementacion.getTblAsset( ) ;
                
                
                int tamanio = campania.getMeses( ) ;
                if( campania.getTblTipoCampania( ).getCveTipoCampania( ) == 2 )
                {
                    Date /*fecFinAsset = asseT.getFecFinCamp( ) ,*/ campIni = campania.getFechaIni( ) , campFin = campania.getFechaFin( ) ;
                    SimpleDateFormat sdf = new SimpleDateFormat( "dd-MM-yyyy" ) ;
//                    String finAsset = sdf.format( fecFinAsset ) , iniCamp = sdf.format( campIni ) ;
                    String finAsset = sdf.format( campFin ) , iniCamp = sdf.format( campIni ) ;
                    int mesAsset = 0 , mesCamp = 0 ;
                    finAsset = finAsset.substring( 3 , 5 ) ;
                    iniCamp = iniCamp.substring( 3 , 5 ) ;
                    mesAsset = Integer.parseInt( finAsset ) ;
                    mesCamp = Integer.parseInt( iniCamp ) ;
                    
                    if( mesCamp < mesAsset )
                    {
                        tamanio = (mesAsset - mesCamp) + 1 ;
                    }else if( mesCamp > mesAsset )
                    {
                        tamanio = (mesAsset - mesCamp) +13 ;
//                        tamanio += mesCamp ;
                    }else {
                        tamanio = 1 ;
                    }
                    
                }
                
                
                // toma todos los registros correspondientes de tblCampaniaProductoUsuario
                List< TblCampaniaProductoUsuario > tblCampaniaProductoUsuario = MasterCardDAO.getAllActiveCampaignProdUsrByCampaingId( campania.getCveCampania( ) ) ; 
                
                // toma todos los registros correspondientes de tblCampaniaProductoAdq
                List< TblCampaniaProductoAdq > tblCampaniaProductoAdq = MasterCardDAO.getAllActiveCampaignProdAdqByCampaingId( campania.getCveCampania( ) ) ; 
                
                //System.out.println("RealPath:::: "+ request.getRealPath("/") );
                
                
                int[] meses = new int[tamanio] ;
                int[] ttp = new int[campania.getTblProductos( ).size( )] ;
                int totalp = 0 ;
                int tMes = 0 ;
                int vtar = 0 ;
                
                List<TblCampaniaMes> TblCampaniaMes = new ArrayList< TblCampaniaMes >( ) ;
                
                //List< TblCampaniaMes > tcm = new ArrayList< TblCampaniaMes >( ) ;
                if ( tblCampaniaProductoUsuario != null )
                {
                        for ( TblCampaniaProductoUsuario tcpu : tblCampaniaProductoUsuario )
                    {
                        for ( TblCampaniaMes tcm : tcpu.getTblCampaniaMeses( ) )
                        {
                            TblCampaniaMes.add( tcm ) ;
                        }
                    }
                }
                
                for (int x = 0 ; x < tamanio  ; x++  )
                {
                    meses[ x ] = x + 1 ;
                }
                
                if( campania.getTblTipoCampania( ).getCveTipoCampania( ) == 2 )
                {
                    
                    for ( TblProducto tp : campania.getTblProductos() )
                    {
                                                
                        for (TblCampaniaProductoAdq tca :  tblCampaniaProductoAdq )
                        {       
                            vtar = tca.getTarjetas( ) ;
                            totalp += vtar ;
                            if ( ( tca.getTblProducto( ).getCveProducto( ) == tp.getCveProducto( ) ) && ( tca.getMes( ) <= meses.length ) )
                            {
                                ttp[ tMes ] += tca.getTarjetas( ) ; 
                            }
                            
                        }
                        tMes += 1 ;
                    }
                    
                }else
                {
                    
                    for ( TblProducto tp : campania.getTblProductos() )
                    {
                        
                        for (TblCampaniaProductoAdq tca :  tblCampaniaProductoAdq )
                        {
                            vtar = tca.getTarjetas( ) ;
                            totalp += vtar ;
                            if ( tca.getTblProducto( ).getCveProducto( ) == tp.getCveProducto( ) )
                            {
                                ttp[ tMes ] += tca.getTarjetas( ) ; 
                            }
                        }
                        tMes += 1 ;
                    }
                    
                }                
                
                int total = 0 ;
                
                for( int r = 0 ; r < ttp.length ; r++ ){
                        total += ttp[ r ] ;
                    }
                
                // toma todos los paquetes
                List< TblPaquete > paquetes = campania.getTblPaquetes( ) ;
                
                List< TblAssetWraper > assetS = new ArrayList< TblAssetWraper >( ) ;
                
                // recorre los paquetes
		for( TblPaquete paq : paquetes )
		{
			// toma el asset al que pertenece el paquete
			TblAsset asset = paq.getTblAsset( ) ;
			
			// en caso del null
			if( asset == null )
				// siguiente
				continue ;
			
			// hace la comparacion con los que ya estan
			boolean yaEsta = false ;
			
			TblAssetWraper wraper = null ;
			
			// recorre los assets
			for( TblAssetWraper as : assetS )
				// en el caso de que ya haya una igual
				if( as.getCveAsset( ) == asset.getCveAsset( ) )
				{
					// cambia bandera
					yaEsta = true ;
					
					wraper = as ;
					
					// quiebra el ciclo
					break ;
				}
			
			// en caso de que no exista
			if( ! yaEsta )
				// lo agrega
				assetS.add( new TblAssetWraper( asset ) ) ;
			// en caso de que si exista
			else
				wraper.addPackage( ) ;
				
		}
                
                if( campania.getTblTipoCampania( ).getCveTipoCampania( ) == 2  )
                {
                    int[ ] Productos = new int[ campania.getTblProductos( ).size( ) ] ;
                    int x = 0 ;
                    for( TblProducto prod : campania.getTblProductos( ) )
                    {
                        Productos[ x ] = prod.getCveProducto( ) ;
                        x += 1 ;
                    }
                    
                    
                        int cveCuenta = campania.getTblCuenta( ).getCveCuenta( ) ; //user.getActualCountId( ) ;
                        List< TblDomestic > tdom = new ArrayList< TblDomestic > () ;
                        
                        for ( int i = 0 ; i < Productos.length ; i++ )
                        {
                            List< TblDomestic > dom = MasterCardDAO.existActiveBpsByCountAndProductB( cveCuenta , Productos[ i ] ) ;
                            
                            for ( TblDomestic d : dom )
                            {
                                tdom.add( d ) ;
                            }
                                
                        }
                    
                }
		
		TblFlujo tblFlujo = tblPreimplementacion.getTblFlujo( ) ;//
		
		FlowCampaignTO to = new FlowCampaignTO( ) ;//
		
		to.setCveFlow( tblFlujo.getCveFlujo( ) ) ;//
		to.setFlow( tblFlujo ) ;//
		to.setTblTareaPreimplementacion( tblTareaPreimplementacion ) ;//
		to.setCampania( campania ) ;
                to.setWithFile( true ) ;
                to.setAssetS( assetS ) ;
                to.setMeses( meses ) ;
                to.setTblCampaniaProductoAdq( tblCampaniaProductoAdq ) ;
                to.setTblCampaniaProductoUsr( tblCampaniaProductoUsuario ) ;
                to.setTtp( ttp ) ;
                to.setTotal( total ) ;
                to.setTblCampaniaMeses( TblCampaniaMes ) ;
		
		// extrae la tarea
		TblTarea tarea = tblTareaPreimplementacion.getTblTarea( ) ;
		
		// extrae la forma
		TblForma forma = tarea.getTblForma( ) ;
		
		// nombre del jsp
		String jspName = forma.getArchivoForma( ) ;
		// ruta completa del jsp
		URL ruta = null ;
		try
		{
			System.out.println( "@@@@@@@@@@@@@@@@@@@" + MCUtil.getFormsDirToDisplay( ) + System.getProperty( "file.separator" ) + jspName ) ;
			ruta = new URL( "file" , "localhost" , MCUtil.getFormsDirToDisplay( ) + System.getProperty( "file.separator" ) + jspName ) ;
			
			System.out.println( "@@@@@@@@@@@@@@@@@@@" + ruta ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			MasterCardDAO.closeEntityManager( ) ;
			return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_DATA_PROCESS_ERROR_OBTAINING_PATH , MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.ErrorCalculatingPath" , e.getMessage( ) ) , e ) ;
		}
		
//		String jspPath = ruta.getQuery( ) ;
		String jspPath = "/WEB-INF/formas/" + jspName ;
		
		System.out.println( "FlowUtil.java: jspPath/" + jspPath ) ;
		
		java.util.List< TblAsset > assets = new ArrayList< TblAsset >( ) ;
		java.util.List< TblAsset > assetsDelFlujo = tblPreimplementacion.getTblAssets( ) ;
		
		// recorre assets
		for( TblAsset asset1 : assetsDelFlujo )
			// en caso de que este activo
			if( asset1.getStatus( ) == 1 )
				assets.add( asset1 ) ;
		
		// coloca en el to
		to.setAssets( assets ) ;
		
		// abre el archivo
		File dir = new File( MCUtil.getFormsDir( ) ) ;
//		System.out.println( "***********" + dir.getAbsolutePath( ) ) ;
		File f = new File( dir , jspName ) ;
//		System.out.println( "***********" + f.getAbsolutePath( ) ) ;
		
//		System.getProperties( ).list( System.out ) ;
		
		String fileCode = "" ;
		StringBuffer sb = new StringBuffer( ) ;
		
		try
		{
			System.out.println( "PreimplementationEntregaMaterialesFormProcess.java: lecturaJSP/" ) ;
			BufferedReader rIn = new BufferedReader( new FileReader( f ) ) ;
			
			System.out.println( "PreimplementationEntregaMaterialesFormProcess.java: lecturaJSP/1" ) ;
			String line = "" ;
			
			System.out.println( "PreimplementationEntregaMaterialesFormProcess.java: lecturaJSP/2" ) ;
			while( ( line = rIn.readLine( ) ) != null )
				sb.append( line ) ;
			
			System.out.println( "PreimplementationEntregaMaterialesFormProcess.java: lecturaJSP/3" ) ;
			rIn.close( ) ;
			
			System.out.println( "PreimplementationEntregaMaterialesFormProcess.java: lecturaJSP/4" ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			MasterCardDAO.closeEntityManager( ) ;
			return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_DATA_PROCESS_NO_FORM_FILE_EXIST , MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoFormFileExist" , jspName ) , e ) ;
		}
		
		System.out.println( "PreimplementationEntregaMaterialesFormProcess.java: lecturaJSP/5" ) ;
//		System.out.println( sb.toString( ) ) ;
		
		// coloca la ruta del jsp
		to.setJspPath( jspPath ) ;
		to.setJspCode( sb.toString( ) ) ;
		
		sb.setLength( 0 ) ;
		sb = null ;
		
		System.out.println( "PreimplementationEntregaMaterialesFormProcess.java: to/" + to ) ;
		System.out.println( "PreimplementationEntregaMaterialesFormProcess.java: to.getError/" + to.getError( ) ) ;
		
                MasterCardDAO.closeEntityManager( ) ;
		return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_CAN_DISPLAY , to ) ;
	}
	
	public FlowProcessResult canDisplay( FlowProcessContext ctx )
	{
		TblTareaPreimplementacion tblTareaPreimplementacion = ctx.getTblTareaPreimplementacion( ) ;
		
		// en caso de uqe ya este ejecutado
		if( tblTareaPreimplementacion.getEjecutado( ) == 1 )
			return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_WORK_FLOW_EXECUTED ) ;
		
		// toma las clases para procesar la forma antes de desplegarla
		// toma la tarea
		TblTarea tarea = tblTareaPreimplementacion.getTblTarea( ) ;
		
		String nombreTarea = tarea.getNombre( ) ;
		
		// en caso de que la tarea haya sido desactivada
		if( tarea.getStatus( ) == 0 )
			return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_WORK_FLOW_WORK_DESACTIVATED ) ;
		
		// toma la forma a la que esta ligada la tarea
		TblForma forma = tarea.getTblForma( ) ;
		
		// en caso de que la forma este desactivada
		if( forma.getStatus( ) == 0 )
			return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_WORK_FLOW_WORK_FORM_DESACTIVATED ) ;
		
		/// se pueden agregar mas filtros
		
		return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_CAN_DISPLAY ) ;
	}
	
	public FlowProcessResult processExit( FlowProcessContext ctx )
		throws
			MasterCardException
	{		
                
		int stepupResult = -1 ;
		
		// procesa los datos
		// los guarda en BD
		try
		{
			FlowProcessForm forma = ( FlowProcessForm ) ctx.getUser( ).getAttribute( "FlowProcessForma" ) ;
			
			String exit = forma.getExit( ) ;
			java.math.BigDecimal gdv = forma.getGdv( ) ;
                        
			HttpServletRequest request = ctx.getRequest( ) ;
			
			String comentarios = request.getParameter( "comentarios" ) ,
                                cveEjecucionString = request.getParameter( "cveEjecucion" ) ,
                                Duracion = request.getParameter( "Duracion" ) ;
                        
                        int meses = Integer.parseInt( Duracion ) , tMes = 0 , vtar = 0 ;
                        
                        TblTareaPreimplementacion tblTareaPreimplementacion = ctx.getTblTareaPreimplementacion( ) ;
                        TblCampania campania = tblTareaPreimplementacion.getTblPreimplementacion( ).getTblCampania( ) ;
                        List< TblCampaniaProductoAdq > tblCampaniaProductoAdq = new ArrayList< TblCampaniaProductoAdq >( ) ;

                        TblAsset asset = tblTareaPreimplementacion.getTblAsset( ) ;                        
                        
                        if( campania.getTblTipoCampania( ).getCveTipoCampania( ) == 2 )
                        {

                            for ( TblProducto tp : campania.getTblProductos() )
                            {			
				// recorre los numeros de meses
				for( int iMonth = 1 ; iMonth <= meses ; iMonth++ )
				{
                                    // por cada producto llena un CampaniaProductoAdqWraper
                                    TblCampaniaProductoAdq tCPAdq = new TblCampaniaProductoAdq( ) ;
                                    
                                    // toma el mes en parametro
                                    String mesParam = request.getParameter( "Inp-Adq-" + tp.getCveProducto( ) + "-" + iMonth ) ;
								
                                    // conveirte en numero
                                    int mesTotal = 0 ;
                                    long rev = 0 ;
								
                                    try
                                    {
                                        mesTotal = Integer.parseInt( mesParam ) ;
                                    }catch( Exception e ) {
                                    }
								
                                    // agrega a tCPAdq
                                    tCPAdq.setTblCampania( campania ) ;
                                    tCPAdq.setTblProducto( tp ) ;
                                    tCPAdq.setMes( iMonth ) ;
                                    tCPAdq.setResultado( mesTotal ) ;
                                    
                                    tblCampaniaProductoAdq.add( tCPAdq ) ;
                                  }
                                
                            }

                        }
                        
                        
			
			// intenta convertir a int
			int cveEjecucion = -1 ;
			try
			{
				cveEjecucion = Integer.parseInt( cveEjecucionString ) ;
			}catch( Exception e )
			{
				
			}
			
			StringBuffer sb = new StringBuffer( ) ;
			
			if( comentarios == null )
				comentarios = "" ;
			
			try
			{
                            stepupResult = MasterCardDAO.processCampaignFlowResults( ctx.getUser( ) , ctx.getTblTareaPreimplementacion( ) , ctx.getForm( ).getExit( ) , gdv , tblCampaniaProductoAdq ) ;
//				stepupResult = MasterCardDAO.processCampaignFlowSreen3( ctx.getUser( ) , ctx.getTblTareaPreimplementacion( ) , ctx.getForm( ).getExit( ), comentarios ) ;
			}catch( Exception e )
			{
                            MasterCardDAO.closeEntityManager( ) ;
				e.printStackTrace( ) ;
				return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_DATA_PROCESS_ERROR_RELOAD , e.getMessage( ) , e ) ;
			}
			
			System.out.println( "PreimplementationAutorizaMaterialesFormProcess.java: resultado/" + stepupResult ) ;
			
                        MasterCardDAO.closeEntityManager( ) ;
			return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_DATA_PROCESS_SUCCESS , stepupResult ) ;
			
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_DATA_PROCESS_ERROR_RELOAD , e.getMessage( ) , e ) ;
		}
	}
    
}
